// 枚举
enum ipAddrKind {
    V4,
    V6,
}
// 允许数据直接附加到枚举的变体中
// 优势： - 不需要额外使用struct  - 每个变体可以拥有不同的类型以及关联的数据量
#[derive(Debug)]
enum IpAddr {
    V4(u8, u8, u8, u8),
    V6(String),
    kind { name: String, age: u8 },//匿名结构体
}

// 为枚举定义方法
impl IpAddr {
    fn fnc(&self){
        println!("{:?}",&self)
    }
}

// match
#[derive(Debug)]
enum UsState {
    Alas,
    Ayyy
}

enum Coin {
    Nick,
    Pill,
    Dime,
    Quarter(UsState)
}

// option枚举  -类似Null    - 标准库   - 在预导入模块中  - 描述的是某个值可能存在(某种类型)或不存在的情况

fn main() {
    // 枚举
    let four = ipAddrKind::V4;
    let six = ipAddrKind::V6;
    router(four);
    router(six);
    router(ipAddrKind::V4);

    let home = IpAddr::V4(127, 0, 0, 1);

    home.fnc();

    // option枚举
    let a = Some(1);
    let b = Some("hello");
    let c: Option<u32> = None;

    // match
    value_in_cents(Coin::Quarter(UsState::Alas));

}

fn router(add_kind: ipAddrKind) {}

// match
fn value_in_cents(coin:Coin)->i32{
    match coin {
        Coin::Dime=>20,
        Coin::Nick=>18,
        Coin::Pill=>58,
        Coin::Quarter(state)=>{
            println!("UsState:{:?}",state);
            80
        }
    }
}
